/**
 * 用户认证相关接口
 */

import { post } from './request'
import { saveOpenID } from './request'
import { userStore } from './userStore'
import type { 
  SpbCode2SessionRequest, 
  SpbCode2SessionResponse,
  SpbLoginResponse 
} from './apifox/models'

// login 接口防抖缓存
let loginPromiseCache: Promise<SpbLoginResponse> | null = null
let lastLoginTime: number = 0
const LOGIN_DEBOUNCE_TIME = 1000 // 1秒内的重复调用会被合并

/**
 * 微信 Code 解密
 * 将微信小程序的 code 转换为 session，用于用户登录认证
 * 
 * @param data 请求参数，包含微信授权 code
 * @returns 返回 session 信息（sessionKey 和 openid）
 */
export async function code2Session(data: SpbCode2SessionRequest): Promise<SpbCode2SessionResponse> {
  const response = await post<SpbCode2SessionResponse>('/code2session', data, {
    showLoading: true,
    loadingText: '登录中...',
    disableRetry: true // code2Session 接口报错时不重试
  })
  
  // 如果成功获取到 openid，保存到本地存储并设置6小时缓存
  if (response && response.openid) {
    saveOpenID(response.openid)
    console.log('OpenID 已保存:', response.openid)
  }
  
  return response
}

/**
 * 首页登录数据
 * 获取首页所需的登录数据，包括用户信息、抽奖次数等初始化数据
 * 
 * @param data 请求参数（可选）
 * @param options 额外选项
 * @param options.autoSave 是否自动保存到全局状态（默认 true）
 * @param options.forceRefresh 是否强制刷新，忽略防抖缓存（默认 false）
 * @returns 返回登录响应数据，包含用户信息、团队信息、报名信息等
 */
export async function login(
  data?: Record<string, any>,
  options?: { autoSave?: boolean; forceRefresh?: boolean }
): Promise<SpbLoginResponse> {
  const { autoSave = true, forceRefresh = false } = options || {}
  const now = Date.now()
  
  // 防抖机制：如果距离上次请求时间很短，且不是强制刷新，则返回缓存的 Promise
  if (!forceRefresh && loginPromiseCache && (now - lastLoginTime) < LOGIN_DEBOUNCE_TIME) {
    console.log('检测到短时间内重复调用 login，返回缓存结果')
    return loginPromiseCache
  }
  
  // 创建新的请求 Promise
  lastLoginTime = now
  const currentPromise = (async () => {
    try {
      const response = await post<SpbLoginResponse>('/login', data || {}, {
    showLoading: true,
    loadingText: '加载中...'
  })
      
      // 自动保存到全局状态
      if (autoSave && response) {
        userStore.setLoginData(response)
      }
      
      return response
    } catch (error) {
      // 请求失败时也要清除缓存，允许重试
      throw error
    } finally {
      // 请求完成后延迟清除缓存，确保短时间内重复调用能共享结果
      // 基于请求完成时间，而不是开始时间
      setTimeout(() => {
        // 只有当缓存还是当前 Promise 时才清除（避免清除新的请求）
        if (loginPromiseCache === currentPromise) {
          loginPromiseCache = null
        }
      }, LOGIN_DEBOUNCE_TIME)
    }
  })()
  
  loginPromiseCache = currentPromise
  return currentPromise
}

